/******************************** Copyright (c) ***************************************
** @file:               bsp_drive_03.h                                                                           
** @author:             George                                                             
** @date:               2025-01-07                                         
** @version:            V0.0                                                                              
** @brief:              
**************************************************************************************/
#ifndef __BSP_DRIVE_03_H
#define __BSP_DRIVE_03_H

#include "main.h"


// 控制帧
              
// ID：1  CANID最后两个01改为02(前转向机)              
// 0x1200FD01  写  05 70 00 00 01 00 00 00  设置位置模式
//                 (  地址   ) (   数据  ）
// 0x1200FD01  写  16 70 00 00 0A 00 00 00  位置模式写入角度

// 0x600FD01   写  01 01 00 00 00 00 00 00  设置零点


// 0x300FD01   写  00 00 00 00 00 00 00 00  启动命令
// 0x400FD01   写  00 00 00 00 00 00 00 00  停止命令
// 0x400FD01   写  01 00 00 00 00 00 00 00  停止清故障

// 反馈帧(ID:1)
// 0x20001FD
// 0x28001FD
// 反馈帧(ID:2)
// 0x20002FD
// 0x28002FD

// 行程为-0.6 - 0.6 rad

/**************************************************************************************
**  接口数据申明
**************************************************************************************/




/**************************************************************************************
**  接口函数申明
**************************************************************************************/
#define P_MIN -12.5f //0.3.0.5及之前为12.5，之后为12.57
#define P_MAX 12.5f //0.3.0.5及之前为12.5，之后为12.57
#define V_MIN -20.0f
#define V_MAX 20.0f
#define KP_MIN 0.0f
#define KP_MAX 5000.0f
#define KD_MIN 0.0f
#define KD_MAX 100.0f
#define T_MIN -60.0f
#define T_MAX 60.0f

struct exCanIdInfo{
uint32_t id:8;
uint32_t data:16;
uint32_t mode:5;
uint32_t res:3;
};
// 下面列举常见的通信类型发送：电机使能运行帧（通信类型3）
// can_receive_message_struct rxMsg;
// can_trasnmit_message_struct txMsg={
// .tx_sfid = 0,
// .tx_efid = 0xff,
// .tx_ft = CAN_FT_DATA,
// .tx_ff = CAN_FF_EXTENDED,
// .tx_dlen = 8,
// };
// #define txCanIdEx (*((struct exCanIdInfo*)&(txMsg.tx_efid)))
// #define rxCanIdEx (*((struct exCanIdInfo*)&(rxMsg.rx_efid))) //将扩展帧id解析为自定义数据结构


// #define can_txd() can_message_transmit(CAN0, &txMsg)
// #define can_rxd() can_message_receive(CAN0, CAN_FIFO1, &rxMsg)

extern uint8_t motor_enable_frame[8]; /* 电机使能帧 */
extern void motor_enable(uint8_t id, uint16_t master_id,uint32_t * send_exid,uint8_t * send_data);
extern void motor_controlmode(uint8_t id, float torque, float MechPosition, 
float speed,float kp, float kd,uint32_t * send_exid,uint8_t * send_data);
extern void motor_reset(uint8_t id, uint16_t master_id,uint32_t * send_exid,uint8_t * send_data);
extern void motor_modechange(uint8_t id, uint16_t master_id, uint8_t *runmode,uint16_t *index,uint32_t * send_exid,uint8_t * send_data);
extern void motor_write(uint8_t id, uint16_t master_id, float *ref,uint16_t *index,uint32_t * send_exid,uint8_t * send_data);
void motor_set_zero(uint8_t id, uint16_t master_id,uint32_t * send_exid,uint8_t * send_data);
void motor03_data_to_can_data(float deg, uint8_t * send_data);

#endif	 // __BSP_DRIVE_03_H 
